home *** CD-ROM | disk | FTP | other *** search
- #include "ascsend.h"
-
- /* ------------------------------------------------------------------- */
- /* for cback.o startup */
- /* ------------------------------------------------------------------- */
-
- long __stack = 4096;
- char *__procname = ASCSEND_VERSION;
- long __priority = 0L;
- long __BackGroundIO = 0;
- extern BPTR _Backstdout;
-
- /* ------------------------------------------------------------------- */
-
- struct TagItem FRTags[] =
- {
- ASL_Hail,(ULONG)"ASC_Send: Datei auswählen",
- ASL_FuncFlags,0L,
- ASL_LeftEdge,0L,
- ASL_TopEdge,0L,
- ASL_Dir,0L,
- ASL_Pattern,(ULONG)"~(#?.info)",
- ASL_File,0L,
- TAG_DONE,0L
- };
-
- struct EasyStruct InfoReq =
- {
- 0L,0L,(UBYTE *)"ASC_Send",
- (UBYTE *)ASCSEND_VERSION "\n\nFreeware By Lunqual%%MAB@wsb.freinet.de\n",
- (UBYTE *)"Beenden|Weiter",
- };
-
- UBYTE *version = ASCSEND_VERSION;
- struct NewBroker newbroker;
- CxObj *broker;
- char **tooltypes;
-
- struct List action_list;
- struct Node dummy;
- ULONG verzoegerung;
- ULONG v_char;
- ULONG from_inside;
- UBYTE reqpath[STRINGSIZE];
- UBYTE reqfile[STRINGSIZE];
-
- struct IOStdReq *s_HandlerIO;
- struct MsgPort *s_InputPort;
- BYTE s_device;
-
- long __OSlibversion = 37;
-
- ULONG filesize;
- ULONG filepos;
-
- void __stdargs main(int argc,char **argv)
- {
- int end = FALSE;
- NewList(&action_list);
- {
- if(OpenBroker(argc,argv))
- {
- while(!end)
- {
- Wait(1L << newbroker.nb_Port->mp_SigBit);
- if(HandleBroker() == RETURN_QUIT) end = TRUE;
- }
- CloseBroker();
- }
- }
- exit(0);
- }
-
- int OpenBroker(int argc,char **argv)
- {
- int ret = FALSE;
- UBYTE keybuffer[20];
- UBYTE filebuffer[20];
- if(newbroker.nb_Port = CreateMsgPort())
- {
- tooltypes = ArgArrayInit(argc,argv);
- newbroker.nb_Version = NB_VERSION;
- newbroker.nb_Name = "ASCII_SEND";
- newbroker.nb_Title = "ASCII Send to Window Tool";
- newbroker.nb_Descr = "Sends Textfiles as Inputevents ";
- newbroker.nb_Unique = NBU_UNIQUE | NBU_NOTIFY;
- newbroker.nb_Pri = (BYTE)ArgInt(tooltypes,"CX_PRIORITY",0);
- verzoegerung = (ULONG)ArgInt(tooltypes,"DELAY",0);
- v_char = (ULONG)ArgInt(tooltypes,"DELAYCHAR",0);
- strncpy(reqpath,ArgString(tooltypes,"REQPATH",""),STRINGSIZE);
- strncpy(reqfile,ArgString(tooltypes,"REQFILE",""),STRINGSIZE);
- if(broker = CxBroker(&newbroker,NULL))
- {
- /* make keys */
- long i = HOTKEY_BASE;
- int end = FALSE;
- {
- struct a_node *node;
- if(node = MakeActionNode(ArgString(tooltypes,"INFOKEY","control alt s"),NULL,
- 0)) AddTail(&action_list,(struct Node *)node);
- }
- if(ArgString(tooltypes,"REQUESTKEY","control alt i"))
- {
- struct a_node *node;
- if(node = MakeActionNode(ArgString(tooltypes,"REQUESTKEY","control alt 2"),NULL,
- 1)) AddTail(&action_list,(struct Node *)node);
- }
- if(ArgString(tooltypes,"STOPKEY",NULL))
- {
- struct a_node *node;
- if(node = MakeActionNode(ArgString(tooltypes,"STOPKEY","control alt 3"),NULL,
- 2)) AddTail(&action_list,(struct Node *)node);
- }
- for(;!end;i++)
- {
- sprintf(keybuffer,"HOTKEY%ld",i - HOTKEY_BASE);
- sprintf(filebuffer,"FILE%ld",i - HOTKEY_BASE);
- if(ArgString(tooltypes,keybuffer,NULL))
- {
- if(ArgString(tooltypes,filebuffer,NULL))
- {
- struct a_node *node;
- if(node = MakeActionNode(ArgString(tooltypes,keybuffer,NULL),
- ArgString(tooltypes,filebuffer,NULL),
- i))
- {
- AddTail(&action_list,(struct Node *)node);
- ret = TRUE;
- }
- }
- }
- else end = TRUE;
- }
- }
- }
- if(ret)ActivateCxObj(broker,1L);
- return ret;
- }
-
- void CloseBroker()
- {
- struct a_node *n;
- struct Message *msg;
- if(broker)
- {
- if(newbroker.nb_Port)
- {
- while(msg = GetMsg(newbroker.nb_Port))ReplyMsg(msg);
- DeletePort(newbroker.nb_Port);
- }
- while(n = (struct a_node *)RemHead(&action_list))RemActionNode(n);
- DeleteCxObjAll(broker);
- if(tooltypes)ArgArrayDone();
- }
- }
-
- struct a_node *MakeActionNode(UBYTE *key,UBYTE *file,LONG ID)
- {
- struct a_node *node;
- if(node = (struct a_node *)AllocVec(sizeof(struct a_node),MEMF_ANY | MEMF_CLEAR))
- {
- strncpy(node->an_action.hotkey,key,STRINGSIZE);
- if(file)strncpy(node->an_action.file,file,STRINGSIZE);
- node->an_action.id = ID;
- if(node->an_action.key = CxFilter(node->an_action.hotkey))
- {
- AttachCxObj(broker,node->an_action.key);
- if(node->an_action.sender = CxSender(newbroker.nb_Port,ID))
- {
- AttachCxObj(node->an_action.key,node->an_action.sender);
- if(node->an_action.translate = (CxTranslate(NULL)))
- {
- AttachCxObj(node->an_action.key,node->an_action.translate);
- }
- }
- }
- }
- return node;
- }
-
- void RemActionNode(struct a_node *node)
- {
- DeleteCxObjAll(node->an_action.key);
- FreeVec(node);
- }
-
- int HandleBroker()
- {
- LONG id,type;
- int rc = RETURN_IS_OK;
- CxMsg *msg;
- if(msg = (CxMsg *)GetMsg(newbroker.nb_Port))
- {
- id = CxMsgID(msg);
- type = CxMsgType(msg);
- ReplyMsg((struct Message *)msg);
- switch(type)
- {
- case CXM_IEVENT :{
- struct a_node *node;
- if(node = Findentry(id))
- {
- if(id == 0)
- {
- if(EasyRequest(NULL,&InfoReq,NULL) == 1)rc = RETURN_QUIT;
- }
- else if(id == 1)
- {
- UBYTE filename[STRINGSIZE];
- struct Window *active_wd;
- active_wd = IntuitionBase->ActiveWindow;
- if(!from_inside)
- {
- if(showrequest())
- {
- strncpy(filename,reqpath,STRINGSIZE);
- AddPart(filename,reqfile,STRINGSIZE);
- ScreenToFront(active_wd->WScreen);
- ActivateWindow(active_wd);
- rc = Sendfile(filename,GET_A_FILE);
- }
- }
- }
- else if(id == 2)
- {
- rc = RETURN_STOP;
- }
- else if(!from_inside)rc = Sendfile(node->an_action.file,GET_A_FILE);
- }
- }
- break;
- case CXM_COMMAND :
- switch(id)
- {
- case CXCMD_DISABLE : ActivateCxObj(broker,0L);
- break;
- case CXCMD_ENABLE : ActivateCxObj(broker,1L);
- break;
- case CXCMD_KILL : if(EasyRequest(NULL,&InfoReq,NULL) == 1)rc = RETURN_QUIT;
- break;
- case CXCMD_UNIQUE : rc = RETURN_QUIT;
- break;
- default : break;
- }
- break;
- default : break;
- }
- }
- return rc;
- }
-
- long __regargs Sendfile(UBYTE *filename,ULONG mode)
- {
- int rc = TRUE;
- struct InputEvent *ie;
- UBYTE buffer[STRINGSIZE];
- UBYTE *filebuffer;
- int Ldelay = FALSE;
- ULONG stop = FALSE;
- ULONG v_line;
- ULONG v_z;
- ULONG fpm;
- ULONG brk = IE_COUNT;
- if(!makeIHandler())return rc;
- v_line = verzoegerung;
- v_z = v_char;
- from_inside = TRUE;
- filepos = 0;
- if(filebuffer = getfilebuffer(filename,mode))
- {
- while((getnextchar(filebuffer,buffer)) && (!stop))
- {
- *(buffer + 1) = 0;
- switch(*buffer)
- {
- case '\n' : Ldelay = TRUE;
- strcpy(buffer,"\\n");
- break;
- case '\r' : Ldelay = TRUE;
- strcpy(buffer,"\\r");
- break;
- case '\t' : strcpy(buffer,"\\t");
- break;
- case '\\' : fpm = filepos;
- getnextchar(filebuffer,buffer + 1);
- *(buffer + 2) = 0;
- {
- int end = FALSE;
- int p = 2;
- ULONG v;
- if((*(buffer + 1)=='d')||(*(buffer + 1)=='l')||(*(buffer + 1)=='c')||
- (*(buffer + 1)=='n')||(*(buffer + 1)=='r')||(*(buffer + 1)=='t'))
- {
- do
- {
- if( (*(buffer + 1)=='n')||(*(buffer + 1)=='r')||(*(buffer + 1)=='t'))
- {
- end = TRUE;
- }
- else
- {
- getnextchar(filebuffer,buffer + p);
- if(!(isdigit(*(buffer + p))) || (p >= 6))
- {
- end = TRUE;
- *(buffer + p + 1) = 0;
- v = atol(buffer + 2);
- switch(*(buffer + 1))
- {
- case 'd' : Delay(v);
- break;
- case 'l' : v_line = v;
- break;
- case 'c' : v_z = v;
- break;
- default : break;
- }
- *buffer = 0;
- filepos -= 1;
- }
- p++;
- if(p >= (STRINGSIZE - 2))end = TRUE;
- }
- }
- while(!end);
- }
- else
- {
- UBYTE t[2] = {0,0};
- struct InputEvent ev;
- if(*(buffer + 1) == '(')
- {
- getnextchar(filebuffer,buffer + 2);
- getnextchar(filebuffer,buffer + 3);
- getnextchar(filebuffer,buffer + 4);
- getnextchar(filebuffer,buffer + 5);
- if((*(buffer + 3) == 'm')&&(*(buffer + 5)==':'))
- {
- int p = 6;
- int py;
- int end = FALSE;
- while(!end)
- {
- getnextchar(filebuffer,buffer + p);
- if(!(isdigit(*(buffer + p))))
- {
- end = TRUE;
- }
- p++;
- }
- --p;
- if(*(buffer + p) == ',')
- {
- p++;
- py = p;
- end = FALSE;
- while(!end)
- {
- getnextchar(filebuffer,buffer + p);
- if(!(isdigit(*(buffer + p))))
- {
- end = TRUE;
- }
- p++;
- }
- --p;
- if(*(buffer + p) == ')')
- {
- ev.ie_Class = IECLASS_POINTERPOS;
- ev.ie_NextEvent = NULL;
- ev.ie_Qualifier = 0;
- ev.ie_SubClass = 0;
- ev.ie_TimeStamp.tv_secs = 0;
- ev.ie_TimeStamp.tv_micro = 0;
- ev.ie_Y = (WORD)atol(buffer + py);
- ev.ie_X = (WORD)atol(buffer + 6);
- switch(*(buffer + 2))
- {
- case 'l' : if(*(buffer + 4) == 'd')
- ev.ie_Code = IECODE_LBUTTON ;
- else
- ev.ie_Code = IECODE_LBUTTON | IECODE_UP_PREFIX;
- my_AddIEvents(&ev);
- break;
- case 'r' : if(*(buffer + 4) == 'd')
- ev.ie_Code = IECODE_RBUTTON ;
- else
- ev.ie_Code = IECODE_RBUTTON | IECODE_UP_PREFIX;
- my_AddIEvents(&ev);
- break;
- case 'm' : if(*(buffer + 4) == 'd')
- ev.ie_Code = IECODE_MBUTTON ;
- else
- ev.ie_Code = IECODE_MBUTTON | IECODE_UP_PREFIX;
- my_AddIEvents(&ev);
- break;
- }
- *buffer = 0;
- }
- else
- {
- filepos =fpm;
- strcpy(buffer,"\\\\");
- if(ie = InvertString(buffer,NULL))
- {
- my_AddIEvents(ie);
- FreeIEvents(ie);
- *buffer = 0;
- }
- }
- }
- else
- {
- filepos = fpm;
- strcpy(buffer,"\\\\");
- if(ie = InvertString(buffer,NULL))
- {
- my_AddIEvents(ie);
- FreeIEvents(ie);
- *buffer = 0;
- }
- }
- }
- else
- {
- filepos = fpm;
- strcpy(buffer,"\\\\");
- if(ie = InvertString(buffer,NULL))
- {
- my_AddIEvents(ie);
- FreeIEvents(ie);
- *buffer = 0;
- }
- }
- }
- else
- {
- t[0] = *(buffer + 1);
- strcpy(buffer,"\\\\");
- if(ie = InvertString(buffer,NULL))
- {
- my_AddIEvents(ie);
- FreeIEvents(ie);
- }
- }
- strcpy(buffer,t);
- switch(*buffer)
- {
- case '\n' : strcpy(buffer,"\\n");
- break;
- case '\r' : strcpy(buffer,"\\r");
- break;
- case '<' : *buffer = 0;filepos -= 1;
- break;
- }
- }
- }
- break;
- case '<' : {
- int end;
- int p;
- end = FALSE;
- p = 1;
- fpm = filepos;
- do
- {
- getnextchar(filebuffer,buffer + p);
- switch(*(buffer + p))
- {
- case '\r':
- case '\n': if(ie = InvertString("\\<",NULL))
- {
- my_AddIEvents(ie);
- FreeIEvents(ie);
- }
- filepos = fpm;
- *buffer = 0;
- end = TRUE;
- break;
- case '>' : *(buffer + p + 1) = 0;
- if(ie = InvertString(buffer,NULL))
- {
- my_AddIEvents(ie);
- FreeIEvents(ie);
- }
- else
- {
- if(ie = InvertString("\\<",NULL))
- {
- my_AddIEvents(ie);
- FreeIEvents(ie);
- }
- filepos = fpm;
- }
- *buffer = 0;
- end = TRUE;
- break;
- default : break;
- }
- p++;
- if(p >= (STRINGSIZE - 2))end = TRUE;
- }
- while(!end);
- break;
- }
-
- case '>' : if(ie = InvertString(buffer,NULL))
- {
- my_AddIEvents(ie);
- FreeIEvents(ie);
- }
- strcpy(buffer,"\\>");
- break;
- default : *(buffer + 1) = 0;
- break;
- }
- if(ie = InvertString(buffer,NULL))
- {
- --brk;
- if(v_z)Delay(v_z);
- my_AddIEvents(ie);
- if(Ldelay)
- {
- Delay(v_line);
- Ldelay = FALSE;
- brk = 0;
- }
- if(!brk)
- {
- brk = IE_COUNT;
- {
- int r = HandleBroker();
- switch(r)
- {
- case RETURN_STOP : stop = TRUE;
- break;
- case RETURN_QUIT : stop = TRUE; rc = RETURN_QUIT;
- break;
- case RETURN_IS_OK :
- default : break;
- }
- }
- }
- FreeIEvents(ie);
- }
- }
- freefilebuffer(filebuffer,filesize);
- }
- from_inside=FALSE;
- remIHandler();
- return rc;
- }
-
- struct a_node *Findentry(LONG id)
- {
- struct a_node *n;
- for(n = (struct a_node *)action_list.lh_Head;n->an_Node.ln_Succ;n = (struct a_node *)n->an_Node.ln_Succ)
- {
- if(n->an_action.id == id)return n;
- }
- return NULL;
- }
-
- int showrequest()
- {
- int ret = FALSE;
- struct FileRequester *FileReq;
- struct Screen *rscreen;
- if(rscreen = LockPubScreen(NULL))ScreenToFront(rscreen);
- FRTags[4].ti_Data = (ULONG)reqpath;
- FRTags[6].ti_Data = (ULONG)reqfile;
- if(FileReq = (struct FileRequester *)AllocAslRequest(ASL_FileRequest,FRTags))
- {
- if(RequestFile(FileReq))
- {
- ret = TRUE;
- strcpy(reqfile,FileReq->rf_File);
- strcpy(reqpath,FileReq->rf_Dir);
- }
- FreeAslRequest((APTR)FileReq);
- }
- return ret;
- }
-
- UBYTE __regargs *makemem(ULONG size)
- {
- return((UBYTE *)AllocVec(size,MEMF_PUBLIC | MEMF_CLEAR));
- }
-
- void releasemem(void *mem)
- {
- FreeVec(mem);
- }
-
- UBYTE __regargs *getfilebuffer(UBYTE *filename,ULONG mode)
- {
- struct FileInfoBlock *fib;
- BPTR lock,fh;
- UBYTE *buffer;
- switch( mode )
- {
- case GET_A_FILE:
- if(lock = Lock(filename,ACCESS_READ))
- {
- if(fib = AllocDosObject(DOS_FIB,TAG_DONE))
- {
- Examine(lock,fib);
- filesize = fib->fib_Size;
- FreeDosObject(DOS_FIB,fib);
- if(buffer = (UBYTE *)makemem(filesize))
- {
- if(fh = OpenFromLock(lock))
- {
- FRead(fh,buffer,filesize,1);
- Close(fh);
- return buffer;
- }
- else UnLock(lock);
- }
- }
- }
- return NULL;
- break;
- case GET_A_STRING :
- filesize = strlen(filename + 1);
- if(buffer = (UBYTE *)makemem(filesize))
- {
- strcpy(buffer,filename);
- return buffer;
- }
- else return NULL;
- break;
- }
- return NULL;
- }
-
- void __regargs freefilebuffer(UBYTE *buffer,ULONG size)
- {
- releasemem(buffer);
- }
-
- BOOL __regargs getnextchar(UBYTE *buffer,UBYTE *where)
- {
- if(filepos >= filesize)return FALSE;
- *where = *(buffer + filepos);
- filepos++;
- return TRUE;
- }
-
-
- /*********************************************************************/
- /* InputHandler Glump */
- /*********************************************************************/
-
- LONG makeIHandler()
- {
- if(s_InputPort = CreateMsgPort())
- {
- if(s_HandlerIO = (struct IOStdReq *)CreateExtIO(s_InputPort,sizeof(struct IOStdReq)))
- {
- if(!(s_device = OpenDevice("input.device",NULL,(struct IORequest *)s_HandlerIO,0L)))
- {
- s_HandlerIO->io_Length = sizeof(struct InputEvent);
- s_HandlerIO->io_Command = IND_WRITEEVENT;
- return(TRUE);
- }
- }
- }
- return (FALSE);
- }
-
- void remIHandler()
- {
- if(s_HandlerIO)
- {
- if(!s_device)CloseDevice((struct IORequest *)s_HandlerIO);
- DeleteExtIO((struct IORequest *)s_HandlerIO);
- s_HandlerIO = NULL;
- }
- if(s_InputPort)
- {
- DeletePort(s_InputPort);
- s_InputPort = NULL;
- }
- }
-
-